home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 January: Mac OS SDK / Dev.CD Jan 98 SDK2.toast / Development Kits (Disc 2) / QuickTime Conferencing / Programming Stuff / Sample Code / SeeWorld / MeetingPlace.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-04-23  |  10.5 KB  |  607 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        MeetingPlace.c
  3.  
  4.     Contains:    Where all the Interesting People come
  5.  
  6.     Written by:    Guy Riddle
  7.  
  8.     Copyright:    © 1994 by Apple Computer, Inc., all rights reserved.
  9. */
  10.  
  11. #include <Types.h>
  12. #include <QuickDraw.h>
  13. #include <Fonts.h>
  14. #include <Events.h>
  15. #include <Windows.h>
  16. #include <Menus.h>
  17. #include <Dialogs.h>
  18. #include <Desk.h>
  19. #include <ToolUtils.h>
  20. #include <Memory.h>
  21. #include <SegLoad.h>
  22. #include <Files.h>
  23. #include <Folders.h>
  24. #include <OSUtils.h>
  25. #include <DiskInit.h>
  26. #include <Scrap.h>
  27. #include <TextUtils.h>
  28.  
  29. #include <String.h>
  30. #include <Strings.h>
  31. #include <stdio.h>
  32.  
  33. #include <QuickTimeConferencing.h>
  34.  
  35. #include "See.h"
  36.  
  37. typedef    EventRecord            *EventRecordPtr;
  38. typedef    Byte                *BytePtr;
  39.  
  40. #define        MAXMEMBERS        6
  41.  
  42. typedef struct {
  43.     QElemPtr                qLink;
  44.     DialogRef                window;
  45.     ComponentInstance        cc;
  46.     MTConferenceToken        conference;
  47.     MTCString63                password;
  48.     MTConferenceMember        member[MAXMEMBERS+1];
  49. } PlaceHolder, *PlaceHolderPtr;
  50.  
  51.     QHdr                    gPlaces;
  52.  
  53. #define        PW_CLEAR        'pw-C'                            
  54.                             
  55.     MTCapabilitiesList        gCapabilities            = { 1, { PW_CLEAR, 1, mtMessageRequiredCapability } };
  56.                             
  57.     MTCString63                gPlaceName, gPassword;
  58.     MTCString32                gServiceType;
  59.     
  60.     void            Initialize(void);
  61.     Boolean            Configure(void);
  62.     void            EnableButton(DialogRef, short, Boolean);
  63.     void            GetValue(BytePtr, DialogRef, short);
  64.     void            SetValue(BytePtr, DialogRef, short);
  65.  ComponentInstance    StartMovieTalk(void);
  66.     void            EventLoop(void);
  67.     
  68.     void            DoToolboxEvent(EventRecordPtr);
  69.     void            DoKeyDownEvent(EventRecordPtr);
  70.     void            DoMouseDownEvent(EventRecordPtr);
  71.     void            DoDiskEvent(EventRecordPtr);
  72.     void            AdjustMenus(void);
  73.     void            DoMenuBar(long);
  74.     void            DoAppleMenu(short);
  75.     void            DoFileMenu(short);
  76.     void            DoMenuNew(void);
  77.     void            DoMenuClose(void);
  78.     
  79.     void            DoConferenceEvent(PlaceHolderPtr, MTConferenceEventPtr);
  80.     void            DoConfReady(PlaceHolderPtr, MTConferenceEventPtr);
  81.     void            DoMemberReady(PlaceHolderPtr, MTConferenceEventPtr);
  82.     void            DoMessageArrived(PlaceHolderPtr, MTConferenceEventPtr);
  83.     void            DoMemberTerminated(PlaceHolderPtr, MTConferenceEventPtr);
  84.     void            DoConfTerminated(PlaceHolderPtr, MTConferenceEventPtr);
  85.     void            DoIncomingCall(PlaceHolderPtr, MTConferenceEventPtr);
  86.  
  87.     int                FindMember(PlaceHolderPtr, MTConferenceMember);
  88.     void            SetMember(PlaceHolderPtr, int, MTConferenceMember);
  89.     
  90. /*
  91.  *    MeetingPlace
  92.  *
  93.  *    This illustrates a conferencing application that sends and receives no media data,
  94.  *    just joins callers together.
  95.  *
  96.  *    • No controllers are needed
  97.  *
  98.  *    • No calls are placed
  99.  *
  100.  *    • You can register multiple services in the same application, each gets a separate
  101.  *    conference component instance
  102.  */
  103.  
  104. void main()
  105. {
  106.     Initialize();
  107.     
  108.     EventLoop();
  109. }
  110.  
  111.     void 
  112. Initialize(
  113.     void
  114. ){
  115.     Handle                    menuBar;
  116.  
  117.     InitGraf((Ptr) &qd.thePort);
  118.     InitFonts();
  119.     InitWindows();
  120.     InitMenus();
  121.     TEInit();
  122.     InitDialogs(nil);
  123.     InitCursor();
  124.  
  125.     menuBar = GetNewMBar(rMeeterMenuBar);
  126.  
  127.     SetMenuBar(menuBar);
  128.     DisposHandle(menuBar);
  129.     AddResMenu(GetMHandle(mApple), 'DRVR');
  130.  
  131.     DrawMenuBar();
  132. }
  133.  
  134.     Boolean
  135. Configure(
  136.     void
  137. ){
  138.     DialogRef                dp;
  139.     short                    itemHit;
  140.     
  141.     dp = GetNewDialog(rNewPlace, 0, (WindowRef) -1);
  142.     SetDialogCancelItem(dp, diCancel);
  143.     SetDialogDefaultItem(dp, diOK);
  144.     SetDialogTracksCursor(dp, true);
  145.     PostEvent(keyDown, '\b');        // ick
  146.     
  147.     do{
  148.         EnableButton(dp, diOK, gPlaceName[0] && gServiceType[0]);
  149.         
  150.         ModalDialog(0, &itemHit);
  151.         
  152.         GetValue(gPlaceName, dp, diName);
  153.         GetValue(gPassword, dp, diPassword);
  154.         GetValue(gServiceType, dp, diServiceType);
  155.     }while(itemHit > diCancel);
  156.     
  157.     DisposeDialog(dp);
  158.     InitCursor();
  159.     
  160.     return(itemHit == diOK);
  161. }
  162.  
  163.     void
  164. EnableButton(
  165.     DialogRef                dp,
  166.     short                    item,
  167.     Boolean                    enabled
  168. ){
  169.     Handle                    ih;
  170.     Rect                    rect;
  171.     short                    type;
  172.     
  173.     GetDialogItem(dp, item, &type, &ih, &rect);
  174.  
  175.     if(enabled)
  176.         type &= ~itemDisable;
  177.     else
  178.         type |= itemDisable;
  179.     
  180.     HiliteControl((ControlHandle) ih, enabled ? 0 : 255);
  181.     
  182.     SetDialogItem(dp, item, type, ih, &rect);
  183.     
  184.     SetPort(dp);
  185.     InsetRect(&rect, -5, -5);
  186.     InvalRect(&rect);
  187. }
  188.  
  189.     void
  190. GetValue(
  191.     BytePtr                    p,
  192.     DialogRef                dp,
  193.     short                    item
  194. ){
  195.     Handle                    ih;
  196.     Rect                    rect;
  197.     short                    type;
  198.     
  199.     GetDialogItem(dp, item, &type, &ih, &rect);
  200.     GetDialogItemText(ih, p);
  201.     
  202.     if(p[0] && p[p[0]] < ' '){
  203.         p[0]--;            // strip CR or other junk
  204.         SetDialogItemText(ih, p);
  205.     }
  206.     
  207.     p2cstr(p);
  208. }
  209.  
  210.     void
  211. SetValue(
  212.     BytePtr                    p,
  213.     DialogRef                dp,
  214.     short                    item
  215. ){
  216.     Handle                    ih;
  217.     Rect                    rect;
  218.     short                    type;
  219.     Str255                    text;
  220.     
  221.     GetDialogItem(dp, item, &type, &ih, &rect);
  222.     
  223.     SetDialogItemText(ih, c2pstr(strcpy((char*)text, (char*)p)));
  224. }
  225.  
  226.     ComponentInstance
  227. StartMovieTalk(
  228.     void
  229. ){
  230.     ComponentInstance        cc;
  231.     MTCapabilitiesHandle    ch;
  232.     MTCString63                service;
  233.     
  234.     cc = OpenDefaultComponent(kMTConferenceType, kMTMovieTalkSubType);
  235.     
  236.     MTConferenceSetMode(cc, mtJoinerModeMask+mtShareableModeMask);
  237.                               
  238.     if(gPassword[0]){
  239.         PtrToHand((Ptr) &gCapabilities, (Handle *) &ch, sizeof(gCapabilities));
  240.         MTConferenceSetMessageCapabilities(cc, ch);
  241.     }
  242.     
  243.     sprintf((char*)service, "mtlkatlk\t%s\x0D", gServiceType);
  244.     
  245.     MTConferenceListen(cc, gPlaceName, gPlaceName, service);
  246.     
  247.     return(cc);
  248. }                            
  249.  
  250.     void
  251. EventLoop(
  252.     void
  253. ){
  254.     PlaceHolderPtr            ph;
  255.     EventRecord                tEvent;
  256.     MTConferenceEvent        cEvent;
  257.  
  258.     for(;;){
  259.         for(ph = (PlaceHolderPtr) gPlaces.qHead; ph; ph = (PlaceHolderPtr) ph->qLink)
  260.             if(MTConferenceGetNextEvent(ph->cc, &cEvent))
  261.                 DoConferenceEvent(ph, &cEvent);
  262.             
  263.         if(WaitNextEvent(everyEvent, &tEvent, 1, 0))
  264.             DoToolboxEvent(&tEvent);
  265.     }
  266. }
  267.  
  268.     void
  269. DoToolboxEvent(
  270.     EventRecordPtr            ev
  271. ){
  272.     DialogRef                dp;
  273.     short                    item;
  274.     
  275.     if(IsDialogEvent(ev) && DialogSelect(ev, &dp, &item))
  276.         return;
  277.     
  278.     switch(ev->what) {
  279.     case mouseDown:
  280.         DoMouseDownEvent(ev);
  281.         break;
  282.     
  283.     case keyDown:
  284.         DoKeyDownEvent(ev);
  285.         break;
  286.     
  287.     case diskEvt:
  288.         DoDiskEvent(ev);
  289.     }
  290. }
  291.  
  292.     void
  293. DoMouseDownEvent(
  294.     EventRecordPtr            ev
  295. ){
  296.     WindowPtr                wp;
  297.     Rect                    box;
  298.     short                    part;
  299.     
  300.     part = FindWindow(ev->where, &wp);
  301.     
  302.     switch(part){
  303.     case inMenuBar:
  304.         AdjustMenus();
  305.         DoMenuBar(MenuSelect(ev->where));
  306.         break;
  307.         
  308.     case inGoAway:
  309.         DoMenuClose();
  310.         break;
  311.         
  312.     case inContent:
  313.         SelectWindow(wp);
  314.         break;
  315.         
  316.     case inDrag:
  317.         box = (*GetGrayRgn())->rgnBBox;
  318.         
  319.         DragWindow(wp, ev->where, &box);
  320.     }
  321. }
  322.  
  323.     void
  324. DoKeyDownEvent(
  325.     EventRecordPtr            ev
  326. ){
  327.     if(ev->modifiers & cmdKey){
  328.         AdjustMenus();    
  329.         DoMenuBar(MenuKey(ev->message & charCodeMask));
  330.     }
  331. }
  332.  
  333.     void
  334. DoDiskEvent(
  335.     EventRecordPtr            ev
  336. ){
  337.     Point                    where;
  338.  
  339.     if(HiWord(ev->message)){
  340.         SetPt(&where, kDILeft, kDITop);
  341.         DIBadMount(where, ev->message);
  342.     }
  343. }
  344.  
  345.     void
  346. AdjustMenus(
  347.     void
  348. ){
  349.     MenuHandle                mh;
  350.     
  351.     mh = GetMHandle(mpFile);
  352.     
  353.     FrontWindow() ? EnableItem(mh, ipClose) : DisableItem(mh, ipClose);
  354. }
  355.  
  356.     void
  357. DoMenuBar(
  358.     long                    selection
  359. ){
  360.     short                    menuID;    
  361.     short                    menuItem;
  362.  
  363.     menuID = HiWord(selection);
  364.     menuItem = LoWord(selection);
  365.     
  366.     switch(menuID){
  367.     case mApple:
  368.         DoAppleMenu(menuItem);
  369.         break;
  370.         
  371.     case mpFile:
  372.         DoFileMenu(menuItem);
  373.         break;
  374.         
  375.     case mEdit:                    /* call SystemEdit for DA editing & MultiFinder */
  376.         SystemEdit(menuItem-1);
  377.     }
  378.     
  379.     HiliteMenu(0);
  380. }
  381.  
  382.     void
  383. DoAppleMenu(
  384.     short                    item
  385. ){
  386.     DialogRef                dp;
  387.     Str255                    daName;
  388.     short                    itemHit;
  389.  
  390.     switch(item){
  391.     case iAbout:
  392.         dp = GetNewDialog(rAboutAlert, nil, (WindowRef) -1);
  393.         SetDialogDefaultItem(dp, 1);
  394.         
  395.         ModalDialog(0, &itemHit);
  396.         
  397.         DisposeDialog(dp);
  398.         break;
  399.         
  400.     default:            /* all non-About items in this menu are DAs */
  401.         GetItem(GetMHandle(mApple), item, daName);
  402.         OpenDeskAcc(daName);
  403.     }
  404. }
  405.  
  406.     void
  407. DoFileMenu(
  408.     short                    item
  409. ){
  410.     switch(item){
  411.     case ipNew:
  412.         DoMenuNew();
  413.         break;
  414.         
  415.     case ipClose:
  416.         DoMenuClose();
  417.         break;
  418.         
  419.     case ipQuit:
  420.         while(FrontWindow())
  421.             DoMenuClose();
  422.         
  423.         ExitToShell();
  424.     }
  425. }
  426.  
  427.     void
  428. DoMenuNew(
  429.     void
  430. ){
  431.     PlaceHolderPtr            ph;
  432.     Str255                    title;
  433.  
  434.     if(!Configure())
  435.         return;
  436.         
  437.     ph = (PlaceHolderPtr) NewPtrClear(sizeof(PlaceHolder));
  438.     
  439.     ph->cc = StartMovieTalk();
  440.     strcpy((char*)ph->password, (char*)gPassword);
  441.     
  442.     ph->window = GetNewDialog(rPlaceHolder, 0, (WindowRef) -1);
  443.     
  444.     sprintf((char*)title, "%s (%s)", gPlaceName, gServiceType);
  445.     SetWTitle(ph->window, c2pstr((char*)title));
  446.     ShowWindow(ph->window);
  447.     
  448.     Enqueue((QElemPtr) ph, &gPlaces);
  449. }
  450.  
  451.     void
  452. DoMenuClose(
  453.     void
  454. ){
  455.     PlaceHolderPtr            ph;
  456.     WindowRef                wp;
  457.     
  458.     wp = FrontWindow();
  459.     
  460.     for(ph = (PlaceHolderPtr) gPlaces.qHead; ph; ph = (PlaceHolderPtr) ph->qLink)
  461.         if(wp == ph->window)
  462.             break;
  463.     if(!ph)
  464.         return;
  465.         
  466.     CloseComponent(ph->cc);
  467.     DisposeDialog(ph->window);
  468.     
  469.     Dequeue((QElemPtr) ph, &gPlaces);
  470.     
  471.     DisposePtr((Ptr) ph);
  472. }
  473.  
  474.     void
  475. DoConferenceEvent(
  476.     PlaceHolderPtr            ph,
  477.     MTConferenceEventPtr    ce
  478. ){
  479.     switch(ce->what){
  480.     case mtIncomingCallEvent:
  481.         DoIncomingCall(ph, ce);
  482.         break;
  483.  
  484.     case mtConferenceReadyEvent:
  485.         DoConfReady(ph, ce);
  486.         break;
  487.     
  488.     case mtConferenceTerminatedEvent:
  489.         DoConfTerminated(ph, ce);
  490.         break;
  491.     
  492.     case mtMemberReadyEvent:
  493.         DoMemberReady(ph, ce);
  494.         break;
  495.     
  496.     case mtMemberTerminatedEvent:
  497.         DoMemberTerminated(ph, ce);
  498.         break;
  499.     
  500.     case mtMessageArrivedEvent:
  501.         DoMessageArrived(ph, ce);
  502.     }
  503.     
  504.     if(ce->surprise)
  505.         DisposeHandle(ce->surprise);
  506. }
  507.  
  508.     void
  509. DoIncomingCall(
  510.     PlaceHolderPtr            ph,
  511.     MTConferenceEventPtr    ce
  512. ){
  513.     if(!FindMember(ph, 0))
  514.         MTConferenceReply(ph->cc, ce->who, sessTableErr);
  515.     else if(!ph->password[0])    
  516.         MTConferenceReply(ph->cc, ce->who, 0);
  517. }
  518.     
  519.     int
  520. FindMember(
  521.     PlaceHolderPtr            ph,
  522.     MTConferenceMember        who
  523. ){
  524.     int                        i;
  525.  
  526.     for(i = 1; i <= MAXMEMBERS; i++)
  527.         if(who == ph->member[i])
  528.             return(i);
  529.             
  530.     return(0);
  531. }
  532.  
  533.     void
  534. DoConfReady(
  535.     PlaceHolderPtr            ph,
  536.     MTConferenceEventPtr    ce
  537. ){
  538.     if(ph->conference)
  539.         MTConferenceMerge(ph->cc, ph->conference, ce->who);
  540.     else
  541.         MTConferenceActivateConference(ph->cc, ph->conference = ce->who, 0);
  542. }
  543.  
  544.     void
  545. DoMemberReady(
  546.     PlaceHolderPtr            ph,
  547.     MTConferenceEventPtr    ce
  548. ){
  549.     int                        n;
  550.     
  551.     MTConferenceActivateMember(ph->cc, ce->who, 0);
  552.     
  553.     if(n = FindMember(ph, 0))
  554.         SetMember(ph, n, ce->who);
  555. }
  556.  
  557.     void
  558. SetMember(
  559.     PlaceHolderPtr            ph,
  560.     int                        n,
  561.     MTConferenceMember        who
  562. ){
  563.     unsigned long            datetime;
  564.     Str255                    string;
  565.     BytePtr                    name;
  566.     
  567.     GetDateTime(&datetime);
  568.     IUTimeString(datetime, false, string);
  569.     p2cstr(string);
  570.     strcat((char*)string, " ……");
  571.     
  572.     ph->member[n] = who;
  573.  
  574.     name = (BytePtr)(who ? MTConferenceGetMemberName(ph->cc, who) : "\p");
  575.     SetValue(name, ph->window, dhMemberZero + n);
  576.     
  577.     name = (BytePtr)(who ? string : "\p");
  578.     SetValue(name, ph->window, dhTimeZero + n);
  579. }
  580.  
  581.     void
  582. DoMemberTerminated(
  583.     PlaceHolderPtr            ph,
  584.     MTConferenceEventPtr    ce
  585. ){
  586.     int                        n;
  587.     
  588.     if(n = FindMember(ph, ce->who))
  589.         SetMember(ph, n, 0);
  590. }
  591.  
  592.     void
  593. DoMessageArrived(
  594.     PlaceHolderPtr            ph,
  595.     MTConferenceEventPtr    ce
  596. ){
  597.     MTConferenceReply(ph->cc, ce->who, strcmp((char*)ph->password, *ce->surprise) ? afpUserNotAuth : 0);
  598. }
  599.  
  600.     void
  601. DoConfTerminated(
  602.     PlaceHolderPtr            ph,
  603.     MTConferenceEventPtr    ce
  604. ){
  605.     if(ph->conference == ce->who)
  606.         ph->conference = 0;
  607. }